package main

/*
检测正方形，
在平面坐标系中，增加（add）一些点[x,y] 如：
然后给定一个点[x,y]
计算（count）可以构成正方形的个数 <==> 找出其他3个点，来构成正方形
其中增加的点 如[3, 10]、[3, 10]，算作两个不同的点在同一个坐标中
0 <= x, y <= 1000
调用 add 和 count 的 总次数 最多为 5000

例如：add、add、add、count count、add、count <==> [3, 10]、[11, 2]、[3, 2]、[11, 10]、[14, 8]、[11, 2]、[11, 10]
输出[null,null,null,1，0，null,2]
1 表示[3, 10]、[11, 2]、[3, 2]、[11, 10] 这4个点可以在平面坐标系中构成一个正方形
0表示，没有3个点能和[14, 8]构成一个正方形
2表示，[3, 10]、[11, 2]、[3, 2]或 [3, 10]、[3, 2]、[11, 2]  能与[11, 10]构成正方形
*/

// DetectSquares  map[纵坐标，map[横坐标，点个数]]
type DetectSquares map[int]map[int]int

func Constructor() DetectSquares {
	return DetectSquares{}

}

func (s DetectSquares) add(point []int) {
	x, y := point[0], point[1]
	if s[y] == nil {
		s[y] = make(map[int]int)
	}
	s[y][x]++
}

func (s DetectSquares) count(point []int) (ans int) {
	x, y := point[0], point[1]
	if s[y] == nil {
		return
	}
	// 获取纵坐标相同的点合集
	colY := s[y]

	// 遍历坐标轴，以纵坐标为基准
	for col, columnX := range s {
		if col == y {
			continue
		}
		// 计算边长
		d := col - y
		// 个数 = （纵坐标相同，横坐标不同）* (纵坐标不同，横坐标相同) * (纵横坐标都不同)
		// 由于map的特性，key不存在的为0值，所以相乘为0，可以用来计算个数
		ans += colY[x+d] * columnX[x] * columnX[x+d]
		// 坐标具有对称性
		ans += colY[x-d] * columnX[x] * columnX[x-d]
	}
	return
}

func main() {

}
